; disk library
;
; ***************************************************************************************************************
; * dskgranuals()
; ***************************************************************************************************************
FUNCTION	DSKGRANUALS
REM	;dskgranuals() creates a granual table 70 bytes long  though only 68 is used
REM	;returns address on X
; 68 granuals
GRANUAL68	FCB	0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0
DSKGRANUALS	LDX	#GRANUAL68
	RTS
ENDFUNCTION
;
; ***************************************************************************************************************
; * dsk256()
; ***************************************************************************************************************
FUNCTION	DSK256
REM	;dsk256() creates a 256 byte table for reading disk sectors
REM	; returns address on x
BYTES256	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	;32
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	;64
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	;96
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	;128
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	;160
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	;192
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	;224
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	;256
DSK256	LDX	#BYTES256
	RTS
ENDFUNCTION
;
;
; **************************************************************************************************************
; * dskfilelist()
; **************************************************************************************************************
FUNCTION	DSKFILELIST
REM	; dskfilelist() creates a file table for loading and saving
REM	; returns address on X
FILELIST$	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	;file 0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	;1
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	;67 =68files
DSKFILELIST	LDX	#FILELIST$
	RTS
ENDFUNCTION
;
;
; ***************************************************************************************************************
; * dskdir(drive,dir list,256 byte temp,granual list)
; ***************************************************************************************************************
FUNCTION	DSKDIR	DCDRV,X,Y,U
REM	; dskdir(drive,addr,addr2,addr3) drive number 0-3 addr pointer to save directory info
REM	; addr2 for a 256 byte table for temp data storage from disk.  addr3 68 byte granual table pointer
DEF	DCDRV	BYTE
DEF	X	STRING
DEF	Y	STRING
DEF	U	STRING
SAVEX	FCB	0,0	;return directory list
SAVEU	FCB	0,0	;68 byte granual list
DCOPC	FCB	0
DCDRV	FCB	0
DCTRK	FCB	0
DCSEC	FCB	0
DCBPT	FCB	0,0	;256 byte table
DCSTA	FCB	0	;error report
RETRY	FCB	0
BCNT	FCB	0	;b counter
DCFILES	FCB	0	;files found
TEMPD	FCB	0,0
DSKDIR	STX	SAVEX	;save incase i need to use index
	STY	DCBPT
	STU	SAVEU
	LDY	DCBPT	;256 byte temp storage
	LDD	DCBPT
	ADDD	#250
	STD	TEMPD	;cutoff check
; ok setup for granual read
	LDA	#2
	STA	DCOPC	;opcode read
	LDA	#17
	STA	DCTRK	;track
	LDA	#2
	STA	DCSEC	;sector
	JSR	GETSECTOR	;jump to grab data off disk
	CMPA	#1
	BEQ	NEXTP1	;it loaded
; problem occured
	CLRB
	RTS	; return result 0 on b register..... failed
; ok lets fill directory files in
NEXTP1	JSR	COPYSECT	;copy the sector table only once
	LDB	#3	;start search
	STB	BCNT	;save counter
	CLR	RETRY	;clear retry times
	CLR	DCFILES	;clear file entry
LOOPD1	LDA	DCFILES
	LDB	BCNT
	CMPA	#67
	BHS	LOOPD4	;done lets exit
	STB	DCSEC	;adjust sector search
	JSR	GETSECTOR
	CMPA	#1	;load?
	BEQ	CONTDL
; oops failed
	INC	RETRY
	LDA	RETRY
	CMPA	#12
	BLO	LOOPD1	;retry
	CLRA
	STA	$FF40
	RTS	;failed and lets exit
CONTDL	CLR	RETRY	;reset retry counter cause last one loaded
	LDX	DCBPT	; 256 byte temp
; start look
	LDU	SAVEX
	LDA	DCFILES
	LDB	#16
	MUL
	LEAU	D,U
LOOPD2	LDA	DCFILES
	CMPA	#67
	BHS	LOOPD4	;done lets exit
	CLRB
LOOPD3	LDA	B,X
	STA	,U+
	INCB
	CMPB	#16
	BLO	LOOPD3
	LEAX	32,X	;next file
	INC	DCFILES
	CMPX	TEMPD
	BLO	LOOPD2
	INC	BCNT	;sector counter
	LDB	BCNT
	CMPB	#12	;sector 9 is 68 files
	BLO	LOOPD1
LOOPD4	CLRA
	STA	$FF40
	LDA	#1
	RTS	;exit and we are done
; *************************
; * getsector
; *************************
; try 6 times then fail
GETSECTOR	LDX	$C006
	LDA	DCOPC
	STA	0,X
	LDA	DCDRV
	STA	1,X
	LDA	DCTRK
	STA	2,X
	LDA	DCSEC
	STA	3,X
	LDD	DCBPT
	STD	4,X
	CLR	RETRY
RETR1	JSR	[$C004]	;run ml routine
; check for errors
	LDX	$C006
	LDA	6,X
	STA	DCSTA
	BEQ	GOOD1
; not good
	INC	RETRY
	LDA	RETRY
	CMPA	#12
	BLO	RETR1
	CLRA
	RTS	;failed 0 returned on A
; lets copy 68 granuals of data
GOOD1	LDA	#1
	RTS
COPYSECT	LDU	SAVEU
	LDX	DCBPT	;256 byte temp table
	CLRB
LOOPM	LDA	,X+
	STA	,U+
	INCB
	CMPB	#68	;data 0-67
	BLO	LOOPM
	RTS	;return
ENDFUNCTION
;
;
; *************************************************************************************************************
; * dskfind(filename$,filetable pointer)
; *************************************************************************************************************
FUNCTION	DSKFIND	X,U
REM	;dskfind(file name pointer, file list pointer) "MYFILE01BAS"=11 chrs and the file pointer list
REM	; see examples dsk RETURNS FILE NUMBER TO B REG and filename pointer to u
DEF	X	STRING
DEF	U	STRING
SAVEX	FCB	0,0
SAVEU	FCB	0,0
TEMP2	FCB	0
FNDFILE	FCB	0	;file location
DSKFIND	STX	SAVEX
	STU	SAVEU
	LDA	#255
	STA	FNDFILE
	CLR	TEMP2
FNDLP0	LDX	SAVEX
	CLRB
FNDLP1	LDA	B,X
	CMPA	B,U
	BNE	NOMAT
	INCB
	CMPB	#11
	BLO	FNDLP1
MATCH	LDB	TEMP2
	STB	FNDFILE
	RTS	;B has file number	
NOMAT	LEAU	16,U
	INC	TEMP2
	LDA	TEMP2
	CMPA	#67
	BLS	FNDLP0
; complete fail
	LDB	#255
	RTS
ENDFUNCTION
;
; ****************************************************************************************************************************
; * dskloadm( drive, filename$, bytewrite,bytes256 pointer, gran68 pointer)
; ****************************************************************************************************************************
FUNCTION	DSKLOADM	DCDRV,X,BYTEWRITE,Y,U
REM	; dskloadm(drive,filename$,header start,bytes256 pointer,granuals68 pointer)
REM	; see examples
DEF	DCDRV	BYTE
DEF	X	STRING
DEF	BYTEWRITE	WORD
DEF	Y	STRING
DEF	U	STRING
SAVEU	FCB	0,0	;68 granual table
SAVEX	FCB	0,0	;FILENAME LOC
DCOPC	FCB	0	;op code
DCDRV	FCB	0	;drive number
DCTRK	FCB	0	;track
DCSEC	FCB	0	;sector
HEADER	FCB	0	;=1 if it does not use header system
DCBPT	FCB	0,0	;256byte table
DCSTA	FCB	0	;error report
RETRY	FCB	0	;how many retries before giving up
BCNT	FCB	0	;b counter
DCFILES	FCB	0	;files found
TEMPD	FCB	0,0	;end256byte tbl
FNDFILE	FCB	0	;file number
MACH1	FCB	0
MACH2	FCB	0,0
FIRSTGRAN	FCB	0
LASTBYTES	FCB	0
NEXTGRAN	FCB	0
READTRK	FCB	0
READSEC	FCB	0
READSEC2	FCB	0
BYTESTOF	FCB	0,0
BYTESCNTR	FCB	0,0
BYTEWRITE	FCB	0,0
GRAN	FCB	0
TEMP2	FCB	0
TEMP	FCB	0
CHFILE	FCB	0	;SAFETY CHECK
LASTGR	FCB	0
DSKLOADM	CLRA
;	LDA	#1
;	STA	$FFDE	;RAM/ROM
	CLR	BCNT
	LDA	#1
	STA	HEADER
	LDD	BYTEWRITE
	CMPD	#0
	BNE	CONTDL1
	CLR	HEADER
CONTDL1	STX	SAVEX
	LDY	,Y
	STY	DCBPT
	LDU	,U
	STU	SAVEU
	LDD	DCBPT
	ADDD	#250
	STD	TEMPD	;256 bytes cut off look
	CLR	LASTGR
; ok setup for grabing granual table
	LDA	#2
	STA	DCOPC
	LDA	#17
	STA	DCTRK
	LDA	#2
	STA	DCSEC
	JSR	GETSECTOR
	CMPA	#1
	BEQ	NEXTP1	;it loaded
; problem
	CLRB
	RTS	;return 0 as did not load
; its good lets grab granuals
NEXTP1	JSR	COPYSECT
; ok so we need to grab directory and search for a match
	LDB	#3	;start search on sector 3
	STB	BCNT	;save counter
	CLR	RETRY
	CLR	DCFILES
LOOPD1	LDB	BCNT
	STB	DCSEC	;store sector search
	JSR	GETSECTOR
	CMPA	#1	;load?
	BEQ	CONTDL
; oops failed
	INC	RETRY
	LDA	RETRY
	CMPA	#6
	BLO	LOOPD1	;retry
EXITERROR	CLRB
	CLRA
	STA	$FF40
	RTS	;done exiting in error ***************************************************************
; 
CONTDL	CLR	RETRY
	LDX	DCBPT	;256 byte table
; start looking for file match
	LDU	SAVEX	;get addr
	CLRB
FNDLP1	LDA	B,X
	CMPA	B,U
	BNE	NOMAT
	INCB	;it looks to be starting to match
	CMPB	#11
	BLO	FNDLP1
; ok we found the file
MATCH	LBRA	LOADM	;jump to loadm
NOMAT	LEAX	32,X	;jump to next file
	INC	DCFILES	;lets look at next file
	LDA	DCFILES
	CMPA	#68
	LBHS	EXITERROR	;exit in error
	CLRB	;clear b register
	CMPX	TEMPD
	BLO	FNDLP1	;lets look at next file
; ok we have gone over
	INC	BCNT
	LDB	BCNT	;load the sector and increase it
	CMPB	#12
	LBLO	LOOPD1
	LBRA	EXITERROR	;bad exit
; * get sector *****************************************************
GETSECTOR	LDX	$C006
	LDA	DCOPC
	STA	0,X
	LDA	DCDRV
	STA	1,X
	LDA	DCTRK
	STA	2,X
	LDA	DCSEC
	STA	3,X
	LDD	DCBPT
	STD	4,X
	CLR	RETRY
RETR1	JSR	[$C004]	;run ml
; check for errors
	LDX	$C006
	LDA	6,X
	STA	DCSTA
	BEQ	GOOD1
; not good
	INC	RETRY
	LDA	RETRY
	CMPA	#12
	BLO	RETR1
	CLRA
	RTS	;failed and 0 returned to a reg
; its good
GOOD1	LDA	#1
	RTS	;return good
; * copy sect *************************************************************
COPYSECT	LDU	SAVEU
	LDX	DCBPT
	CLRB
LOOPM	LDA	,X+
	STA	,U+
	INCB
	CMPB	#68	;data 0-67
	BLO	LOOPM
	RTS	;done
; * load it **********************************************************************************************
; x has file marker on 256 byte table
; u has filename but its been confirmed exists
LOADM	LDA	13,X	;first granual 0-67
	STA	FIRSTGRAN
	LDA	15,X
	STA	LASTBYTES	;last bytes of the last sector
	LDU	SAVEU	;load the 68byte gran table
	LDA	FIRSTGRAN
	LDB	A,U
	STB	NEXTGRAN
	LDA	FIRSTGRAN
	JSR	SETDISK
	CLRA
	CLRB
	STD	BYTESTOF	;starts with needing a header
	STD	BYTESCNTR	;the counter
; transfer loop start
TRANSFER2	LDA	READTRK
	STA	DCTRK
	LDA	READSEC
	STA	DCSEC
	CLR	RETRY
TFRRETRY	JSR	GETSECTOR
	CMPA	#1	;load?
	BEQ	TFRSUCC
; oops failed
	INC	RETRY
	LDA	RETRY
	CMPA	#6
	BLS	TFRRETRY	;retry
	CLRB
	RTS	;done exiting in error ***************************************************************
; process data
TFRSUCC	CLR	TEMP
	LDX	DCBPT	;256 byte table
; check no header?
	LDA	HEADER
	BNE	TRANSFER1	;just get the data =1 if no header
	LDD	BYTESTOF
	CMPD	#0
	BNE	TRANSFER1
NEWHD	LDX	DCBPT	;the buffer
	LDB	TEMP
	ABX
	LDA	0,X
	BEQ	GRABHEADER
	CMPA	#255
	BEQ	FOOTER
; exit in error
	LBNE	EXITERROR
; was footer
FOOTER	LDD	3,X
	STD	MACH2
	JMP	DONEBASLD	;we are done and loaded
GRABHEADER	LDD	1,X
	STD	BYTESTOF
	LDB	#5	;PLAY WITH THIS NUMBER
	ADDB	TEMP
	STB	TEMP
	CLRA
	CLRB
	STD	BYTESCNTR
	LDD	3,X
	STD	BYTEWRITE	;reset y addr write
; transfer actual
TRANSFER1	LDX	DCBPT
	LDY	BYTEWRITE
	LDB	TEMP
	ABX
;	ORCC	#$50	;kill irq
	LDA	,X
;	STA	$FFDF	;ram/ROM RETURN FFDF =RAMRAM
	STA	,Y+
;	STA	$FFDE	;ram/ROM
;	ANDCC	#$EF	;restore irq
	STY	BYTEWRITE
	INC	TEMP
; is this the end
; does it have a header?
	LDA	HEADER
	BNE	ITSFINECNT	;needs to skip header checks
; has header system
	LDD	BYTESCNTR
	ADDD	#1
	STD	BYTESCNTR
; is it mach1
; yes it is
	LDD	BYTESCNTR
	CMPD	BYTESTOF
; may need adjustment
	BHS	NEWHD	;need new header
ITSFINECNT	LDA	NEXTGRAN
	CMPA	#192
	BLO	NOTLASTG1
; yes last but final?
	LDA	#1
	STA	LASTGR	;SAFETY
	LDA	READSEC
	CMPA	READSEC2
	BLO	NOTLASTG1
; yes last chunk
	LDB	TEMP
	CMPB	LASTBYTES
	LBHS	DONEBASLD	;its done loading exit for no header also
NOTLASTG1	LDB	TEMP
	CMPB	#0	;SHOULD BE 0
	LBNE	TRANSFER1
; end of inner loop
;	RTS	;PREMATUREHACK RTS
	INC	READSEC
	LDA	READSEC
	CMPA	READSEC2
	LBLS	TRANSFER2
; now we need next gran
	LDA	NEXTGRAN
	CMPA	#192
	BHS	DONEBASLD	;done loading
	STA	FIRSTGRAN
	LDU	SAVEU
	LDB	A,U
	STB	NEXTGRAN
	LDA	FIRSTGRAN
	JSR	SETDISK
	LBRA	TRANSFER2
DONEBASLD	LDD	MACH2
	STD	157
	CLRA
	LDB	#1
	STA	$FF40
	RTS	;its loaded exit with b=1 
; ********************************************************************************************************
; function of finding track,sector,granual
SETDISK	CLR	READSEC
	CLR	READSEC2
	STA	GRAN
	LSRA
	STA	READTRK
	CMPA	#17
	BHS	TRKADD
GETDS1	LDA	GRAN
	ANDA	#1
	LDB	#1
	STB	READSEC
	LDB	#9
	STB	READSEC2
	CMPA	#1
	BEQ	SECT1
	BRA	ISDSKE
SECT1	LDB	#10
	STB	READSEC
	LDB	#18
	STB	READSEC2
	BRA	ISDSKE
TRKADD	ADDA	#1
	STA	READTRK
	BRA	GETDS1
ISDSKE	LDA	NEXTGRAN
	CMPA	#68
	BLS	FULLSETD
	SUBA	#193
	STA	TEMP2
	LDA	READSEC
	ADDA	TEMP2
	STA	READSEC2
FULLSETD	LDB	READSEC
	CLRA
	RTS
ENDFUNCTION
;
;
; ****************************************************************************************************************************
; * dsksavem( drive, HEADER ON, filename$,bytewrite,SIZEF,bytes256 pointer, gran68 pointer)
; ****************************************************************************************************************************
FUNCTION	DSKSAVEM	DCDRV,HEADER,X,BYTEWRITE,SIZEF,Y,U
REM	; dsksavem(drive,no header,filename$,save start,save end,bytes256 pointer,granuals68 pointer)
REM	; see examples
DEF	DCDRV	BYTE
DEF	HEADER	BYTE
DEF	X	STRING
DEF	BYTEWRITE	WORD
DEF	SIZEF	WORD
DEF	Y	STRING
DEF	U	STRING
DCBPT	FCB	0,0	;256byte table
SIZEF	FCB	0,0	;SIZE OF FILE TO WRITE
SAVEU	FCB	0,0	;68 granual table
SAVEX	FCB	0,0	;FILENAME LOC
DCOPC	FCB	0	;op code
DCDRV	FCB	0	;drive number
DCTRK	FCB	0	;track
DCSEC	FCB	0	;sector
HEADER	FCB	0	;=1 if it does not use header system
DCSTA	FCB	0	;error report
RETRY	FCB	0	;how many retries before giving up
BCNT	FCB	0	;b counter
DCFILES	FCB	0	;files found
TEMPD	FCB	0,0	;end256byte tbl
FNDFILE	FCB	0	;file number
MACH1	FCB	0
MACH2	FCB	0,0
FIRSTGRAN	FCB	0
LASTBYTES	FCB	0
NEXTGRAN	FCB	0
READTRK	FCB	0
READSEC	FCB	0
READSEC2	FCB	0
BYTESTOF	FCB	0,0
BYTESCNTR	FCB	0,0
BYTEWRITE	FCB	0,0
GRAN	FCB	0
TEMP2	FCB	0
TEMP3	FCB	0,0
TEMP	FCB	0
CHFILE	FCB	0	;SAFETY CHECK
LASTGR	FCB	0
USEFILEN	FCB	255	;file number to save to
USEFILES	FCB	0	;sector file is located on
DSKSAVEM	CLRA
;	LDA	#1
;	STA	$FFDE
	LDA	#255
	STA	USEFILEN
	CLR	USEFILES
	CLR	BCNT
CONTDL1	STX	SAVEX
	LDY	,Y
	STY	DCBPT	;ONLY STORE
	LDU	,U
	STU	SAVEU
	LDD	DCBPT
	ADDD	#250
	STD	TEMPD	;256 bytes cut off look
	CLR	LASTGR
; ok setup for grabing granual table
	LDA	#2
	STA	DCOPC
	LDA	#17
	STA	DCTRK
	LDA	#2
	STA	DCSEC
	JSR	GETSECTOR
	CMPA	#1
	BEQ	NEXTP1	;it loaded
; problem
	LBRA	EXITERROR8
; its good lets grab granuals
NEXTP1	JSR	COPYSECT
; ok so we need to grab directory and search for a match
	LDB	#3	;start search on sector 3
	STB	BCNT	;save counter
	CLR	RETRY
	CLR	DCFILES
LOOPD1	LDB	BCNT
	STB	DCSEC	;store sector search
	JSR	GETSECTOR
	CMPA	#1	;load?
	BEQ	CONTDL
; oops failed
	INC	RETRY
	LDA	RETRY
	CMPA	#6
	BLO	LOOPD1	;retry
EXITERROR	CLRB
	RTS	;done exiting in error ***************************************************************
; 
CONTDL	CLR	RETRY
	LDX	DCBPT	;256 byte table
; start looking for file match
; also look for first free file number and save its pos on file chain
	LDU	SAVEX	;get addr
FNDLP1	CLRB
	INC	DCFILES
	LDA	B,X
	BEQ	FNDLP7	;could be 0
	CMPA	#255	;could be 255 
	BNE	FNDLP2
; if marker is blank lets call it a spot to save
FNDLP7	LDA	USEFILEN
	CMPA	#255
	BEQ	FNDLP3
	BRA	FNDLP2
; ok lets record first blank file
FNDLP3	LDA	DCFILES
	STA	USEFILEN
	LDA	BCNT
	STA	USEFILES	;its sector
FNDLP2	LDA	B,X
	CMPA	B,U
	BNE	NOMAT
	INCB	;it looks to be starting to match
	CMPB	#11
	BLO	FNDLP2
; ok we found the file
MATCH	LDA	DCFILES
	STA	USEFILEN
	LDA	DCSEC
	STA	USEFILES
	LBRA	SAVEM	;jump to loadm
NOMAT	LEAX	32,X	;jump to next file
	CLRB	;clear b register
	CMPX	TEMPD
	BLO	FNDLP1	;lets look at next file
; ok we have gone over
	LDA	#0
	STA	DCFILES
	INC	BCNT
	LDB	BCNT	;load the sector and increase it
	CMPB	#12
	LBLO	LOOPD1
	LBRA	SAVEM	;bad exit but see if we have a file num anyways
; * get sector *****************************************************
GETSECTOR	LDX	$C006
	LDA	DCOPC
	STA	0,X
	LDA	DCDRV
	STA	1,X
	LDA	DCTRK
	STA	2,X
	LDA	DCSEC
	STA	3,X
	LDD	DCBPT
	STD	4,X
	CLR	RETRY
RETR1	JSR	[$C004]	;run ml
; check for errors
	LDX	$C006
	LDA	6,X
	STA	DCSTA
	BEQ	GOOD1
; not good
	INC	RETRY
	LDA	RETRY
	CMPA	#12
	BLO	RETR1
	LBRA	EXITERROR9
; its good
GOOD1	LDA	#1
	RTS	;return good
; * copy sect *************************************************************
COPYSECT	LDU	SAVEU
	LDX	DCBPT
	CLRB
LOOPM	LDA	,X+
	STA	,U+
	INCB
	CMPB	#68	;data 0-67
	BLO	LOOPM
	RTS	;done
; * load it **********************************************************************************************
; x has file marker on 256 byte table
; u has filename but its been confirmed exists
SAVEM	LDA	USEFILEN	; file 3 sector 3 seems ok
	CMPA	#255
	LBEQ	EXITERROR11	;no files avail
; OK LETS RELOAD THE SECTOR DATA file system i was on
	LDA	#2
	STA	DCOPC	;read
	LDA	USEFILES
	STA	DCSEC
	LDA	#17
	STA	DCTRK
	JSR	GETSECTOR
	BNE	SAVEM1	;its set
	LBRA	EXITERROR6	;problems
SAVEM1	CLR	TEMP
	LDX	DCBPT	;the 256 byte table
	LDB	USEFILEN
	DECB
	LDA	#32
	MUL
	LEAX	D,X	;should be looking at correct file
	LDA	0,X
	CMPA	#255
	BEQ	NOCOUNTH
	LDB	13,X	;loaded first granual on b
CHECKHH	LDU	SAVEU	;load the granual table
	LDA	B,U	;read granual
	STA	TEMP
	LDA	#255
	STA	B,U	;erase original ready
	LDA	TEMP
	CMPA	#192
	BHS	NOCOUNTH
	LDB	TEMP
	BRA	CHECKHH
; was no file or we counted it
NOCOUNTH	CLR	TEMP
	LDU	SAVEU	;68 byte gran table
	CLRB
CCNT1	LDA	B,U
	CMPA	#255
	BNE	JUMP1
	INC	TEMP
JUMP1	INCB
	CMPB	#68
	BHS	DONECNT
	BRA	CCNT1
; hack
; USEFILEN HAS FILE NUMBER
; USEFILES HAS THE SECTOR
; CALC MY SPACE BYTESCNTR
DONECNT	CLRA
	CLRB
	STD	BYTESCNTR
LPCNTR	LDA	TEMP	; possibly a zero by accident?
	CMPA	#28
	BHS	DONEMC2	;too big lots of space avail
	CMPA	#0
	BEQ	DONEMC
	DEC	TEMP
	LDD	BYTESCNTR
	ADDD	#2304
	STD	BYTESCNTR
	BRA	LPCNTR
DONEMC	LDD	SIZEF
	SUBD	BYTEWRITE
	STD	BYTESTOF	;BYTES TO SAVE
	CMPD	BYTESCNTR
	BLO	YUPWES
	LDD	#10000	;error 10
	RTS	;NOPE NO SPACE AVAIL
DONEMC2	LDD	SIZEF
	SUBD	BYTEWRITE
	STD	BYTESTOF	;BYTES TO SAVE
; THIS WORKS
YUPWES	LDA	HEADER	;1= no header 0=header
	BNE	NOHEAD1
	LDD	BYTESTOF
	ADDD	#10
	STD	TEMP3
	BRA	LPENDB
NOHEAD1	LDD	BYTESTOF
	STD	TEMP3
LPENDB	LDD	TEMP3
	CMPD	#256
	BLO	LPGOTV
	SUBD	#256
	STD	TEMP3
	BRA	LPENDB
; got the value
LPGOTV	STB	LASTBYTES
	LDA	USEFILEN
	SUBA	#1
	LDB	#32
	MUL
	LDX	DCBPT	;256 BYTE TABLE
	LEAX	D,X	;AT FILE
; lets copy new file name over
	LDY	SAVEX	;the file name transfer 11 bytes
	CLRB
COPYNM	LDA	B,Y
	STA	B,X
	INCB
	CMPB	#12
	BLO	COPYNM	;continue name copy
; CONT
	LDA	#2
	STA	11,X	; FILE TYPE BIN
	LDA	#0
	STA	12,X	; NOT ASCII
	JSR	FREEGRAN	;ONLY USE U RETURN ON A
	STA	GRAN
	STA	13,X	;STORE FIRST GRAN
	CLR	14,X
	LDA	LASTBYTES
	STA	15,X	;HOW MANY BYTES
	CLR	16,X
	CLR	17,X
	CLR	18,X
	CLR	19,X
	CLR	20,X
	CLR	21,X
	CLR	22,X
	CLR	23,X
	CLR	24,X
	CLR	25,X
	CLR	26,X
	CLR	27,X
	CLR	28,X
	CLR	29,X
	CLR	30,X
	CLR	31,X
; OK SO FAR SO GOOD
	LDA	#3
	STA	DCOPC	;CHANGE TO WRITE STATUS
	LDA	USEFILES	;THE FILE SECTOR
	STA	DCSEC
	LDA	#17
	STA	DCTRK
	JSR	GETSECTOR	;LETS SEE IF I CHANGED THE NAME?
	LBEQ	EXITERROR5	;exit in error
; setup sector range
	LDA	GRAN	;first granual
	STA	FIRSTGRAN
	JSR	SETDISK	;this gives me the range
; x=dcbpt
; y=data
COPYITS	LDY	BYTEWRITE	;start of read
	LDX	DCBPT	;256 byte buffer
; bytestof has how many bytes not including header
; header ?
	CLRB
	CLRA
	STD	BYTESCNTR	;counter
	CLR	TEMP	;256 counter	
	LDA	HEADER
	BEQ	JUMPHEAD
	BRA	NOHEADJ
JUMPHEAD	LDA	#0
	LDB	TEMP	;256 byte counter
	ABX
	STA	,X+
	LDD	BYTESTOF
	STD	,X++
	LDD	BYTEWRITE
	STD	,X++
	LDB	TEMP
	ADDB	#5
	STB	TEMP
	LDX	DCBPT
; transfer code
NOHEADJ	LDX	DCBPT
	LDB	TEMP
	ABX
	LDA	,Y+
	STA	,X
	LDD	BYTESCNTR
	ADDD	#1
	STD	BYTESCNTR
	INC	TEMP
; do a check if last bytes
	LDD	BYTESCNTR
	CMPD	BYTESTOF
	BHS	WEDONEWG	;we are done write out granual table and call it a day***********************
	LDA	TEMP
	BEQ	WRITEOUTS
	BRA	NOHEADJ
WRITEOUTS	LDA	#3
	STA	DCOPC	;CHANGE TO WRITE STATUS
	LDA	READSEC
	STA	DCSEC
	LDA	READTRK
	STA	DCTRK
	JSR	GETSECTOR	;LETS SEE IF I CHANGED THE NAME?
	LBEQ	EXITERROR4	;exit in error
; wrote it? i hope...
	INC	READSEC
	LDA	READSEC
	CMPA	READSEC2
	LBLS	NOHEADJ	;keep the copy going
; ok at this point i need another granual
	LDU	SAVEU	;grantable
	LDB	FIRSTGRAN
	LDA	#99	;temp
	STA	B,U
	JSR	FREEGRAN	;exits with new granual on a
	STA	NEXTGRAN
	LDB	FIRSTGRAN
	STA	B,U	;ok i hope its set fixes that 99 write
	LDA	NEXTGRAN
	STA	FIRSTGRAN
	CLR	NEXTGRAN
	JSR	SETDISK
	LBRA	NOHEADJ
WEDONEWG	LDA	HEADER	;1=no header
	BEQ	ADDFOOT
	BRA	NOFOOT
ADDFOOT	LDB	TEMP
	LDX	DCBPT
	ABX
	LDA	#255	;end file
	STA	,X+
	LDD	#0
	STD	,X++
	LDD	BYTEWRITE
	STD	,X++
	LDB	TEMP
	ADDB	#5
	STB	TEMP
NOFOOT	LDX	DCBPT
	LDA	READSEC
	CMPA	#10
	BLO	ITSG55
; its range is 10-18
	SUBA	#9
; range 1-9
; its range is 1-9
ITSG55	ADDA	#192	;c0
	STA	NEXTGRAN	TEMP
	LDA	LASTBYTES
; hack dunno
	BEQ	ADDMORE
	BRA	NODONT	;this needed a fix i think
ADDMORE	INC	NEXTGRAN
NODONT	LDA	NEXTGRAN
	LDB	FIRSTGRAN
	STA	B,U	;saved it hopefully
; write out new granual table
; * copy sector new data *************************************************************
	LDA	#3
	STA	DCOPC	;CHANGE TO WRITE STATUS
	LDA	READSEC
	STA	DCSEC
	LDA	READTRK
	STA	DCTRK
	JSR	GETSECTOR	;LAST SEC
	LBEQ	EXITERROR3	;exit in error
; wrote it? i hope...
	LDU	SAVEU
	LDX	DCBPT
	CLRB
LOOPM3	LDA	,U+
	STA	,X+
	INCB
	CMPB	#68	;data 0-67
	BLO	LOOPM3
	LDA	#0
LPDF	STA	,X+
	INCB
	BNE	LPDF
	LDA	#3
	STA	DCOPC	;CHANGE TO WRITE STATUS
	LDA	#2
	STA	DCSEC
	LDA	#17
	STA	DCTRK
	JSR	GETSECTOR	;LETS SEE IF I CHANGED THE NAME?
	LBEQ	EXITERROR2
	CLRA
	STA	$FF40
	LDD	#1000	;pass
	RTS	;its loaded exit with b=1
EXITERROR2	CLRA
	STA	$FF40
	LDD	#2000
	RTS
EXITERROR3	CLRA
	STA	$FF40
	LDD	#3000
	RTS
EXITERROR4	CLRA
	STA	$FF40
	LDD	#4000
	RTS
EXITERROR5	CLRA
	STA	$FF40
	LDD	#5000
	RTS
EXITERROR6	CLRA
	STA	$FF40
	LDD	#6000
	RTS
EXITERROR7	CLRA
	STA	$FF40
	LDD	#7000
	RTS
EXITERROR8	CLRA
	STA	$FF40
	LDD	#8000
	RTS
EXITERROR9	CLRA
	STA	$FF40
	LDD	#9000
	RTS
EXITERROR11	CLRA
	STA	$FF40
	LDD	#11000
	RTS
; ********************************************************************************************************
; function of finding track,sector,granual
SETDISK	CLR	READSEC
	CLR	READSEC2
	STA	GRAN
	LSRA
	STA	READTRK
	CMPA	#17
	BHS	TRKADD
GETDS1	LDA	GRAN
	ANDA	#1
	LDB	#1
	STB	READSEC
	LDB	#9
	STB	READSEC2
	CMPA	#1
	BEQ	SECT1
	BRA	ISDSKE
SECT1	LDB	#10
	STB	READSEC
	LDB	#18
	STB	READSEC2
	BRA	ISDSKE
TRKADD	ADDA	#1
	STA	READTRK
	BRA	GETDS1
ISDSKE	CLRA
FULLSETD	CLRB
	CLRA
	RTS
; OK*******************************************************************************************************************
FREEGRAN	LDU	SAVEU	;GRAN TABLE
	CLRA
LPFREE	LDB	A,U
	CMPB	#255
	BEQ	YUPFG
	INCA
	BRA	LPFREE
YUPFG	RTS	;EXIT WITH GRAN ON A
ENDFUNCTION
;
; ****************************************************************************************************************************
; * dskloadmcount( drive, filename$,bytes256 pointer, gran68 pointer)
; ****************************************************************************************************************************
FUNCTION	DSKLOADMCOUNT	DCDRV,X,Y,U
REM	; dskloadmcount(drive,filename$,bytes256 pointer,granuals68 pointer)
REM	; returns how big file is in bytes on y register and does no loading
DEF	DCDRV	BYTE
DEF	X	STRING
DEF	Y	STRING
DEF	U	STRING
SAVEU	FCB	0,0	;68 granual table
SAVEX	FCB	0,0	;FILENAME LOC
DCOPC	FCB	0	;op code
DCDRV	FCB	0	;drive number
DCTRK	FCB	0	;track
DCSEC	FCB	0	;sector
HEADER	FCB	0	;=1 if it does not use header system
DCBPT	FCB	0,0	;256byte table
DCSTA	FCB	0	;error report
RETRY	FCB	0	;how many retries before giving up
BCNT	FCB	0	;b counter
DCFILES	FCB	0	;files found
TEMPD	FCB	0,0	;end256byte tbl
FNDFILE	FCB	0	;file number
MACH1	FCB	0
MACH2	FCB	0,0
FIRSTGRAN	FCB	0
LASTBYTES	FCB	0
NEXTGRAN	FCB	0
READTRK	FCB	0
READSEC	FCB	0
READSEC2	FCB	0
BYTESTOF	FCB	0,0
BYTESCNTR	FCB	0,0
BYTEWRITE	FCB	0,1	;hack
GRAN	FCB	0
TEMP2	FCB	0
TEMP	FCB	0
CHFILE	FCB	0	;SAFETY CHECK
LASTGR	FCB	0
DSKLOADMCOUNT	CLRA
;	LDA	#1
;	STA	$FFDE
	CLR	BCNT
	LDA	#1
	STA	HEADER
	LDB	#1
	CLRA
	STD	BYTEWRITE
	LDD	BYTEWRITE
	CMPD	#0
	BNE	CONTDL1
	CLR	HEADER
CONTDL1	STX	SAVEX
	LDY	,Y
	STY	DCBPT
	LDU	,U
	STU	SAVEU
	LDD	DCBPT
	ADDD	#250
	STD	TEMPD	;256 bytes cut off look
	CLR	LASTGR
; ok setup for grabing granual table
	LDA	#2
	STA	DCOPC
	LDA	#17
	STA	DCTRK
	LDA	#2
	STA	DCSEC
	JSR	GETSECTOR
	CMPA	#1
	BEQ	NEXTP1	;it loaded
; problem
	CLRB
	LDY	#$00	;clear y hopefully
	RTS	;return 0 as did not load
; its good lets grab granuals
NEXTP1	JSR	COPYSECT
; ok so we need to grab directory and search for a match
	LDB	#3	;start search on sector 3
	STB	BCNT	;save counter
	CLR	RETRY
	CLR	DCFILES
LOOPD1	LDB	BCNT
	STB	DCSEC	;store sector search
	JSR	GETSECTOR
	CMPA	#1	;load?
	BEQ	CONTDL
; oops failed
	INC	RETRY
	LDA	RETRY
	CMPA	#6
	BLO	LOOPD1	;retry
EXITERROR	CLRB
	LDY	#$00	;clear y hopefully
	RTS	;done exiting in error ***************************************************************
; 
CONTDL	CLR	RETRY
	LDX	DCBPT	;256 byte table
; start looking for file match
	LDU	SAVEX	;get addr
	CLRB
FNDLP1	LDA	B,X
	CMPA	B,U
	BNE	NOMAT
	INCB	;it looks to be starting to match
	CMPB	#11
	BLO	FNDLP1
; ok we found the file
MATCH	LBRA	LOADM	;jump to loadm
NOMAT	LEAX	32,X	;jump to next file
	INC	DCFILES	;lets look at next file
	LDA	DCFILES
	CMPA	#68
	LBHS	EXITERROR	;exit in error
	CLRB	;clear b register
	CMPX	TEMPD
	BLO	FNDLP1	;lets look at next file
; ok we have gone over
	INC	BCNT
	LDB	BCNT	;load the sector and increase it
	CMPB	#12
	LBLO	LOOPD1
	LBRA	EXITERROR	;bad exit
; * get sector *****************************************************
GETSECTOR	LDX	$C006
	LDA	DCOPC
	STA	0,X
	LDA	DCDRV
	STA	1,X
	LDA	DCTRK
	STA	2,X
	LDA	DCSEC
	STA	3,X
	LDD	DCBPT
	STD	4,X
	CLR	RETRY
RETR1	JSR	[$C004]	;run ml
; check for errors
	LDX	$C006
	LDA	6,X
	STA	DCSTA
	BEQ	GOOD1
; not good
	INC	RETRY
	LDA	RETRY
	CMPA	#12
	BLO	RETR1
	CLRA
	RTS	;failed and 0 returned to a reg
; its good
GOOD1	LDA	#1
	RTS	;return good
; * copy sect *************************************************************
COPYSECT	LDU	SAVEU
	LDX	DCBPT
	CLRB
LOOPM	LDA	,X+
	STA	,U+
	INCB
	CMPB	#68	;data 0-67
	BLO	LOOPM
	RTS	;done
; * load it **********************************************************************************************
; x has file marker on 256 byte table
; u has filename but its been confirmed exists
LOADM	LDA	13,X	;first granual 0-67
	STA	FIRSTGRAN
	LDA	15,X
	STA	LASTBYTES	;last bytes of the last sector
	LDU	SAVEU	;load the 68byte gran table
	LDA	FIRSTGRAN
	LDB	A,U
	STB	NEXTGRAN
	LDA	FIRSTGRAN
	JSR	SETDISK
	CLRA
	CLRB
	STD	BYTESTOF	;starts with needing a header
	STD	BYTESCNTR	;the counter
; transfer loop start
TRANSFER2	LDA	READTRK
	STA	DCTRK
	LDA	READSEC
	STA	DCSEC
	CLR	RETRY
TFRRETRY	JSR	GETSECTOR
	CMPA	#1	;load?
	BEQ	TFRSUCC
; oops failed
	INC	RETRY
	LDA	RETRY
	CMPA	#6
	BLS	TFRRETRY	;retry
	CLRB
	RTS	;done exiting in error ***************************************************************
; process data
TFRSUCC	CLR	TEMP
	LDX	DCBPT	;256 byte table
; check no header?
	LDA	HEADER
	BNE	TRANSFER1	;just get the data =1 if no header
	LDD	BYTESTOF
	CMPD	#0
	BNE	TRANSFER1
NEWHD	LDX	DCBPT	;the buffer
	LDB	TEMP
	ABX
	LDA	0,X
	BEQ	GRABHEADER
	CMPA	#255
	BEQ	FOOTER
; exit in error
	LBNE	EXITERROR
; was footer
FOOTER	LDD	3,X
	STD	MACH2
	JMP	DONEBASLD	;we are done and loaded
GRABHEADER	LDD	1,X
	STD	BYTESTOF
	LDB	#5	;PLAY WITH THIS NUMBER
	ADDB	TEMP
	STB	TEMP
	CLRA
	CLRB
	STD	BYTESCNTR
	LDD	3,X
	STD	BYTEWRITE	;reset y addr write
; transfer actual
TRANSFER1	LDX	DCBPT
	LDY	BYTEWRITE
	LDB	TEMP
	ABX
;	LDA	,X
	LEAY	1,Y
;	STA	,Y+
	STY	BYTEWRITE
	INC	TEMP
; is this the end
; does it have a header?
	LDA	HEADER
	BNE	ITSFINECNT	;needs to skip header checks
; has header system
	LDD	BYTESCNTR
	ADDD	#1
	STD	BYTESCNTR
; is it mach1
; yes it is
	LDD	BYTESCNTR
	CMPD	BYTESTOF
; may need adjustment
	BHS	NEWHD	;need new header
ITSFINECNT	LDA	NEXTGRAN
	CMPA	#192
	BLO	NOTLASTG1
; yes last but final?
	LDA	#1
	STA	LASTGR	;SAFETY
	LDA	READSEC
	CMPA	READSEC2
	BLO	NOTLASTG1
; yes last chunk
	LDB	TEMP
	CMPB	LASTBYTES
	LBHS	DONEBASLD	;its done loading exit for no header also
NOTLASTG1	LDB	TEMP
	CMPB	#0	;SHOULD BE 0
	LBNE	TRANSFER1
; end of inner loop
;	RTS	;PREMATUREHACK RTS
	INC	READSEC
	LDA	READSEC
	CMPA	READSEC2
	LBLS	TRANSFER2
; now we need next gran
	LDA	NEXTGRAN
	CMPA	#192
	BHS	DONEBASLD	;done loading
	STA	FIRSTGRAN
	LDU	SAVEU
	LDB	A,U
	STB	NEXTGRAN
	LDA	FIRSTGRAN
	JSR	SETDISK
	LBRA	TRANSFER2
DONEBASLD	LDD	MACH2
	STD	157
	CLRA
	LDB	#1
	LEAY	-1,Y	;SUBTRACT 1
	RTS	;its loaded exit with b=1 
; ********************************************************************************************************
; function of finding track,sector,granual
SETDISK	CLR	READSEC
	CLR	READSEC2
	STA	GRAN
	LSRA
	STA	READTRK
	CMPA	#17
	BHS	TRKADD
GETDS1	LDA	GRAN
	ANDA	#1
	LDB	#1
	STB	READSEC
	LDB	#9
	STB	READSEC2
	CMPA	#1
	BEQ	SECT1
	BRA	ISDSKE
SECT1	LDB	#10
	STB	READSEC
	LDB	#18
	STB	READSEC2
	BRA	ISDSKE
TRKADD	ADDA	#1
	STA	READTRK
	BRA	GETDS1
ISDSKE	LDA	NEXTGRAN
	CMPA	#68
	BLS	FULLSETD
	SUBA	#193
	STA	TEMP2
	LDA	READSEC
	ADDA	TEMP2
	STA	READSEC2
FULLSETD	LDB	READSEC
	CLRA
	RTS
ENDFUNCTION
;
;
; ****************************************************************************************************************************
; * dskloadmsector( drive, filename$,sect,sectsize,startld,bytes256 pointer, gran68 pointer)
; ****************************************************************************************************************************
FUNCTION	DSKLOADMSECTOR	DCDRV,X,SECT,SECTSIZE,STARTLD,Y,U
REM	; dskloadmcount(drive,filename$,sect,sectsize,load addr,bytes256 pointer,granuals68 pointer)
REM	; returns how big file is in bytes on y register
DEF	DCDRV	BYTE
DEF	X	STRING
DEF	SECT	BYTE
DEF	SECTSIZE	WORD
DEF	STARTLD	WORD
DEF	Y	STRING
DEF	U	STRING
SECT	FCB	0
SECTSIZE	FCB	0,0
STARTLD	FCB	0,0
ENDLD	FCB	0,0
STARTWRITE	FCB	0,0
; get those calced
SAVEU	FCB	0,0	;68 granual table
SAVEX	FCB	0,0	;FILENAME LOC
DCOPC	FCB	0	;op code
DCDRV	FCB	0	;drive number
DCTRK	FCB	0	;track
DCSEC	FCB	0	;sector
HEADER	FCB	0	;=1 if it does not use header system
DCBPT	FCB	0,0	;256byte table
DCSTA	FCB	0	;error report
RETRY	FCB	0	;how many retries before giving up
BCNT	FCB	0	;b counter
DCFILES	FCB	0	;files found
TEMPD	FCB	0,0	;end256byte tbl
FNDFILE	FCB	0	;file number
MACH1	FCB	0
MACH2	FCB	0,0
FIRSTGRAN	FCB	0
LASTBYTES	FCB	0
NEXTGRAN	FCB	0
READTRK	FCB	0
READSEC	FCB	0
READSEC2	FCB	0
BYTESTOF	FCB	0,0
BYTESCNTR	FCB	0,0
BYTEWRITE	FCB	0,1	;hack
GRAN	FCB	0
TEMP2	FCB	0
TEMP	FCB	0
CHFILE	FCB	0	;SAFETY CHECK
LASTGR	FCB	0
COPYNOW	FCB	0
DSKLOADMSECTOR	CLRA
;	LDA	#1
;	STA	$FFDE
	LDD	STARTLD
	ADDD	SECTSIZE
	STD	ENDLD	;end of load
; count the start of where to start loading from
	CLR	TEMP
	CLRA
	CLRB
	STB	COPYNOW
	STD	BYTESCNTR	;use this
LPCTR	CLRA
	LDB	TEMP
	CMPB	SECT
	BEQ	DONESTR1
	LDD	BYTESCNTR
	ADDD	SECTSIZE
	STD	BYTESCNTR
	INC	TEMP
	BRA	LPCTR
DONESTR1	LDD	BYTESCNTR
	STD	STARTWRITE
	CLRA
	CLRB
	STD	BYTESCNTR
	CLR	TEMP
	CLR	BCNT
	LDA	#1
	STA	HEADER
	LDB	#1
	CLRA
	STD	BYTEWRITE
	LDD	BYTEWRITE
	CMPD	#0
	BNE	CONTDL1
	CLR	HEADER
CONTDL1	STX	SAVEX
	LDY	,Y
	STY	DCBPT
	LDU	,U
	STU	SAVEU
	LDD	DCBPT
	ADDD	#250
	STD	TEMPD	;256 bytes cut off look
	CLR	LASTGR
; ok setup for grabing granual table
	LDA	#2
	STA	DCOPC
	LDA	#17
	STA	DCTRK
	LDA	#2
	STA	DCSEC
	JSR	GETSECTOR
	CMPA	#1
	BEQ	NEXTP1	;it loaded
; problem
	CLRB
	RTS	;return 0 as did not load
; its good lets grab granuals
NEXTP1	JSR	COPYSECT
; ok so we need to grab directory and search for a match
	LDB	#3	;start search on sector 3
	STB	BCNT	;save counter
	CLR	RETRY
	CLR	DCFILES
LOOPD1	LDB	BCNT
	STB	DCSEC	;store sector search
	JSR	GETSECTOR
	CMPA	#1	;load?
	BEQ	CONTDL
; oops failed
	INC	RETRY
	LDA	RETRY
	CMPA	#6
	BLO	LOOPD1	;retry
EXITERROR	CLRB
	RTS	;done exiting in error ***************************************************************
; 
CONTDL	CLR	RETRY
	LDX	DCBPT	;256 byte table
; start looking for file match
	LDU	SAVEX	;get addr
	CLRB
FNDLP1	LDA	B,X
	CMPA	B,U
	BNE	NOMAT
	INCB	;it looks to be starting to match
	CMPB	#11
	BLO	FNDLP1
; ok we found the file
MATCH	LBRA	LOADM	;jump to loadm
NOMAT	LEAX	32,X	;jump to next file
	INC	DCFILES	;lets look at next file
	LDA	DCFILES
	CMPA	#68
	LBHS	EXITERROR	;exit in error
	CLRB	;clear b register
	CMPX	TEMPD
	BLO	FNDLP1	;lets look at next file
; ok we have gone over
	INC	BCNT
	LDB	BCNT	;load the sector and increase it
	CMPB	#12
	LBLO	LOOPD1
	LBRA	EXITERROR	;bad exit
; * get sector *****************************************************
GETSECTOR	LDX	$C006
	LDA	DCOPC
	STA	0,X
	LDA	DCDRV
	STA	1,X
	LDA	DCTRK
	STA	2,X
	LDA	DCSEC
	STA	3,X
	LDD	DCBPT
	STD	4,X
	CLR	RETRY
RETR1	JSR	[$C004]	;run ml
; check for errors
	LDX	$C006
	LDA	6,X
	STA	DCSTA
	BEQ	GOOD1
; not good
	INC	RETRY
	LDA	RETRY
	CMPA	#12
	BLO	RETR1
	CLRA
	STA	$FF40
	RTS	;failed and 0 returned to a reg
; its good
GOOD1	LDA	#1
	RTS	;return good
; * copy sect *************************************************************
COPYSECT	LDU	SAVEU
	LDX	DCBPT
	CLRB
LOOPM	LDA	,X+
	STA	,U+
	INCB
	CMPB	#68	;data 0-67
	BLO	LOOPM
	RTS	;done
; * load it **********************************************************************************************
; x has file marker on 256 byte table
; u has filename but its been confirmed exists
LOADM	LDA	13,X	;first granual 0-67
	STA	FIRSTGRAN
	LDA	15,X
	STA	LASTBYTES	;last bytes of the last sector
	LDU	SAVEU	;load the 68byte gran table
	LDA	FIRSTGRAN
	LDB	A,U
	STB	NEXTGRAN
	LDA	FIRSTGRAN
	JSR	SETDISK
	CLRA
	CLRB
	STD	BYTESTOF	;starts with needing a header
	STD	BYTESCNTR	;the counter
; transfer loop start
TRANSFER2	LDA	READTRK
	STA	DCTRK
	LDA	READSEC
	STA	DCSEC
	CLR	RETRY
TFRRETRY	JSR	GETSECTOR
	CMPA	#1	;load?
	BEQ	TFRSUCC
; oops failed
	INC	RETRY
	LDA	RETRY
	CMPA	#6
	BLS	TFRRETRY	;retry
	CLRB
	RTS	;done exiting in error ***************************************************************
; process data
TFRSUCC	CLR	TEMP
	LDX	DCBPT	;256 byte table
; check no header?
	LDA	HEADER
	BNE	TRANSFER1	;just get the data =1 if no header
	LDD	BYTESTOF
	CMPD	#0
	BNE	TRANSFER1
NEWHD	LDX	DCBPT	;the buffer
	LDB	TEMP
	ABX
	LDA	0,X
	BEQ	GRABHEADER
	CMPA	#255
	BEQ	FOOTER
; exit in error
	LBNE	EXITERROR
; was footer
FOOTER	LDD	3,X
	STD	MACH2
	JMP	DONEBASLD	;we are done and loaded
GRABHEADER	LDD	1,X
	STD	BYTESTOF
	LDB	#5	;PLAY WITH THIS NUMBER
	ADDB	TEMP
	STB	TEMP
	CLRA
	CLRB
	STD	BYTESCNTR
	LDD	3,X
	STD	BYTEWRITE	;reset y addr write
; transfer actual
TRANSFER1	LDX	DCBPT
	LDY	BYTEWRITE
	LDB	TEMP
	ABX
; lets see if its time to start writting
	LDD	BYTEWRITE
	SUBD	#1
	CMPD	STARTWRITE
	BEQ	SETSTARTTFR
	BRA	SECTSTSKIP
; ok lets setup the transfer
SETSTARTTFR	LDD	STARTLD
	STD	BYTEWRITE	;at start addr
	LDY	BYTEWRITE
	INC	COPYNOW	;its in copy mode now
SECTSTSKIP	LDA	COPYNOW
	BEQ	NOCOPY
; we copy
	LDA	,X
	STA	,Y+
	BRA	YESCOPY
;	LDA	,X
NOCOPY	LEAY	1,Y
;	STA	,Y+
YESCOPY	STY	BYTEWRITE
	INC	TEMP
	LDA	COPYNOW
	BEQ	SKIPTHIS1
	LDD	BYTEWRITE
	CMPD	ENDLD
	LBHS	DONEBASLD
; is this the end
; does it have a header?
SKIPTHIS1	LDA	HEADER
	BNE	ITSFINECNT	;needs to skip header checks
; has header system
	LDD	BYTESCNTR
	ADDD	#1
	STD	BYTESCNTR
; is it mach1
; yes it is
	LDD	BYTESCNTR
	CMPD	BYTESTOF
; may need adjustment
	LBHS	NEWHD	;need new header
ITSFINECNT	LDA	NEXTGRAN
	CMPA	#192
	BLO	NOTLASTG1
; yes last but final?
	LDA	#1
	STA	LASTGR	;SAFETY
	LDA	READSEC
	CMPA	READSEC2
	BLO	NOTLASTG1
; yes last chunk
	LDB	TEMP
	CMPB	LASTBYTES
	LBHS	DONEBASLD	;its done loading exit for no header also
NOTLASTG1	LDB	TEMP
	CMPB	#0	;SHOULD BE 0
	LBNE	TRANSFER1
; end of inner loop
;	RTS	;PREMATUREHACK RTS
	INC	READSEC
	LDA	READSEC
	CMPA	READSEC2
	LBLS	TRANSFER2
; now we need next gran
	LDA	NEXTGRAN
	CMPA	#192
	BHS	DONEBASLD	;done loading
	STA	FIRSTGRAN
	LDU	SAVEU
	LDB	A,U
	STB	NEXTGRAN
	LDA	FIRSTGRAN
	JSR	SETDISK
	LBRA	TRANSFER2
DONEBASLD	CLRA
	LDB	#1
	RTS	;its loaded exit with b=1 
; ********************************************************************************************************
; function of finding track,sector,granual
SETDISK	CLR	READSEC
	CLR	READSEC2
	STA	GRAN
	LSRA
	STA	READTRK
	CMPA	#17
	BHS	TRKADD
GETDS1	LDA	GRAN
	ANDA	#1
	LDB	#1
	STB	READSEC
	LDB	#9
	STB	READSEC2
	CMPA	#1
	BEQ	SECT1
	BRA	ISDSKE
SECT1	LDB	#10
	STB	READSEC
	LDB	#18
	STB	READSEC2
	BRA	ISDSKE
TRKADD	ADDA	#1
	STA	READTRK
	BRA	GETDS1
ISDSKE	LDA	NEXTGRAN
	CMPA	#68
	BLS	FULLSETD
	SUBA	#193
	STA	TEMP2
	LDA	READSEC
	ADDA	TEMP2
	STA	READSEC2
FULLSETD	LDB	READSEC
	CLRA
	RTS
ENDFUNCTION
;
; 
; ****************************************************************************************************************************
; * dskloadpsg( mpisdc,mpipsg,sram,drive, filename$,bytes256 pointer, gran68 pointer)
; ****************************************************************************************************************************
FUNCTION	DSKLOADPSG	MPISDC,MPIPSG,SRAM,DCDRV,X,Y,U
REM	; dskloadm(mpisdc,mpipsg,sram,drive,filename$,bytes256 pointer,granuals68 pointer)
REM	; see examples uses page 128-191 for flash ram 
DEF	MPISDC	BYTE
DEF	MPIPSG	BYTE
DEF	SRAM	BYTE
DEF	DCDRV	BYTE
DEF	X	STRING
DEF	Y	STRING
DEF	U	STRING
MPISDC	FCB	0
MPIPSG	FCB	0
SRAM	FCB	0
SAVEU	FCB	0,0	;68 granual table
SAVEX	FCB	0,0	;FILENAME LOC
DCOPC	FCB	0	;op code
DCDRV	FCB	0	;drive number
DCTRK	FCB	0	;track
DCSEC	FCB	0	;sector
HEADER	FCB	0	;=1 if it does not use header system
DCBPT	FCB	0,0	;256byte table
DCSTA	FCB	0	;error report
RETRY	FCB	0	;how many retries before giving up
BCNT	FCB	0	;b counter
DCFILES	FCB	0	;files found
TEMPD	FCB	0,0	;end256byte tbl
FNDFILE	FCB	0	;file number
MACH1	FCB	0
MACH2	FCB	0,0
FIRSTGRAN	FCB	0
LASTBYTES	FCB	0
NEXTGRAN	FCB	0
READTRK	FCB	0
READSEC	FCB	0
READSEC2	FCB	0
BYTESTOF	FCB	0,0
BYTESCNTR	FCB	0,0
BYTEWRITE	FCB	0,0
GRAN	FCB	0
TEMP2	FCB	0
TEMP	FCB	0
CHFILE	FCB	0	;SAFETY CHECK
LASTGR	FCB	0
BOOT	FCB	0
YMCTRL	EQU	$FF5D
YMMEMB	EQU	$FF5B	;
YMMEMA	EQU	$FF5A	;use both
DSKLOADPSG	CLRA
;	LDA	#1
;	STA	$FFDE
	LDA	$FF7F
	STA	BOOT
	CLR	BCNT
	LDA	#1
	STA	HEADER
	LDD	#$C000
	STD	BYTEWRITE
	STX	SAVEX
	LDY	,Y
	STY	DCBPT
	LDU	,U
	STU	SAVEU
	LDD	DCBPT
	ADDD	#250
	STD	TEMPD	;256 bytes cut off look
	CLR	LASTGR
; ok setup for grabing granual table
	LDA	#2
	STA	DCOPC
	LDA	#17
	STA	DCTRK
	LDA	#2
	STA	DCSEC
	JSR	GETSECTOR
	CMPA	#1
	BEQ	NEXTP1	;it loaded
; problem
	CLRB
	RTS	;return 0 as did not load
; its good lets grab granuals
NEXTP1	JSR	COPYSECT
; ok so we need to grab directory and search for a match
	LDB	#3	;start search on sector 3
	STB	BCNT	;save counter
	CLR	RETRY
	CLR	DCFILES
LOOPD1	LDB	BCNT
	STB	DCSEC	;store sector search
	JSR	GETSECTOR
	CMPA	#1	;load?
	BEQ	CONTDL
; oops failed
	INC	RETRY
	LDA	RETRY
	CMPA	#6
	BLO	LOOPD1	;retry
EXITERROR	CLRB
	RTS	;done exiting in error ***************************************************************
; 
CONTDL	CLR	RETRY
	LDX	DCBPT	;256 byte table
; start looking for file match
	LDU	SAVEX	;get addr
	CLRB
FNDLP1	LDA	B,X
	CMPA	B,U
	BNE	NOMAT
	INCB	;it looks to be starting to match
	CMPB	#11
	BLO	FNDLP1
; ok we found the file
MATCH	LBRA	LOADM	;jump to loadm
NOMAT	LEAX	32,X	;jump to next file
	INC	DCFILES	;lets look at next file
	LDA	DCFILES
	CMPA	#68
	LBHS	EXITERROR	;exit in error
	CLRB	;clear b register
	CMPX	TEMPD
	BLO	FNDLP1	;lets look at next file
; ok we have gone over
	INC	BCNT
	LDB	BCNT	;load the sector and increase it
	CMPB	#12
	LBLO	LOOPD1
	LBRA	EXITERROR	;bad exit
; * get sector *****************************************************
GETSECTOR	LDX	$C006
	LDA	DCOPC
	STA	0,X
	LDA	DCDRV
	STA	1,X
	LDA	DCTRK
	STA	2,X
	LDA	DCSEC
	STA	3,X
	LDD	DCBPT
	STD	4,X
	CLR	RETRY
RETR1	JSR	[$C004]	;run ml
; check for errors
	LDX	$C006
	LDA	6,X
	STA	DCSTA
	BEQ	GOOD1
; not good
	INC	RETRY
	LDA	RETRY
	CMPA	#12
	BLO	RETR1
	CLRA
	RTS	;failed and 0 returned to a reg
; its good
GOOD1	LDA	#1
	RTS	;return good
; * copy sect *************************************************************
COPYSECT	LDU	SAVEU
	LDX	DCBPT
	CLRB
LOOPM	LDA	,X+
	STA	,U+
	INCB
	CMPB	#68	;data 0-67
	BLO	LOOPM
	RTS	;done
; * load it **********************************************************************************************
; x has file marker on 256 byte table
; u has filename but its been confirmed exists
LOADM	LDA	13,X	;first granual 0-67
	STA	FIRSTGRAN
	LDA	15,X
	STA	LASTBYTES	;last bytes of the last sector
	LDU	SAVEU	;load the 68byte gran table
	LDA	FIRSTGRAN
	LDB	A,U
	STB	NEXTGRAN
	LDA	FIRSTGRAN
	JSR	SETDISK
	CLRA
	CLRB
	STD	BYTESTOF	;starts with needing a header
	STD	BYTESCNTR	;the counter
; transfer loop start
TRANSFER2	LDA	READTRK
	STA	DCTRK
	LDA	READSEC
	STA	DCSEC
	CLR	RETRY
TFRRETRY	JSR	GETSECTOR
	CMPA	#1	;load?
	BEQ	TFRSUCC
; oops failed
	INC	RETRY
	LDA	RETRY
	CMPA	#6
	BLS	TFRRETRY	;retry
	CLRB
	RTS	;done exiting in error ***************************************************************
; process data
TFRSUCC	CLR	TEMP
	LDX	DCBPT	;256 byte table
; check no header?
	LDA	HEADER
	LBNE	TRANSFER1	;just get the data =1 if no header
	LDD	BYTESTOF
	CMPD	#0
	LBNE	TRANSFER1
NEWHD	LDX	DCBPT	;the buffer
	LDB	TEMP
	ABX
	LDA	0,X
	LBEQ	GRABHEADER
	CMPA	#255
	LBEQ	FOOTER
; exit in error
	LBNE	EXITERROR
; was footer
FOOTER	LDD	3,X
	STD	MACH2
	JMP	DONEBASLD	;we are done and loaded
GRABHEADER	LDD	1,X
	STD	BYTESTOF
	LDB	#5	;PLAY WITH THIS NUMBER
	ADDB	TEMP
	STB	TEMP
	CLRA
	CLRB
	STD	BYTESCNTR
	LDD	3,X
	STD	BYTEWRITE	;reset y addr write
; transfer actual
TRANSFER1	LDX	DCBPT
	LDY	BYTEWRITE
	LDB	TEMP
	ABX
;	PSHS	X,Y,U,A,B
	ORCC	#$50
	LDA	BOOT
	ANDA	#240
	STA	MPISDC
	LDA	MPIPSG
	ANDA	#15
	ADDA	MPISDC
	STA	$FF7F
	LDA	#30
	STA	YMCTRL
	LDA	MPIPSG
	STA	$FF7F
	LDA	SRAM
	STA	YMMEMA
	INCA
	STA	YMMEMB
	LDA	,X
	STA	,Y+
	LDA	#22
	STA	YMCTRL
	LDA	BOOT
	STA	$FF7F
	ANDCC	#$EF
;	PULS	B,A,U,Y,X
	STY	BYTEWRITE
	INC	TEMP
; is this the end
; does it have a header?
	LDA	HEADER
	LBNE	ITSFINECNT	;needs to skip header checks
; has header system
	LDD	BYTESCNTR
	ADDD	#1
	STD	BYTESCNTR
; is it mach1
; yes it is
	LDD	BYTESCNTR
	CMPD	BYTESTOF
; may need adjustment
	LBHS	NEWHD	;need new header
ITSFINECNT	LDA	NEXTGRAN
	CMPA	#192
	LBLO	NOTLASTG1
; yes last but final?
	LDA	#1
	STA	LASTGR	;SAFETY
	LDA	READSEC
	CMPA	READSEC2
	LBLO	NOTLASTG1
; yes last chunk
	LDB	TEMP
	CMPB	LASTBYTES
	LBHS	DONEBASLD	;its done loading exit for no header also
NOTLASTG1	LDB	TEMP
	CMPB	#0	;SHOULD BE 0
	LBNE	TRANSFER1
; end of inner loop
;	RTS	;PREMATUREHACK RTS
	INC	READSEC
	LDA	READSEC
	CMPA	READSEC2
	LBLS	TRANSFER2
; now we need next gran
	LDA	NEXTGRAN
	CMPA	#192
	BHS	DONEBASLD	;done loading
	STA	FIRSTGRAN
	LDU	SAVEU
	LDB	A,U
	STB	NEXTGRAN
	LDA	FIRSTGRAN
	JSR	SETDISK
	LBRA	TRANSFER2
DONEBASLD	LDD	MACH2
;	STD	157
	CLRA
	LDB	#1
	STA	$FF40
	RTS	;its loaded exit with b=1 
; ********************************************************************************************************
; function of finding track,sector,granual
SETDISK	CLR	READSEC
	CLR	READSEC2
	STA	GRAN
	LSRA
	STA	READTRK
	CMPA	#17
	BHS	TRKADD
GETDS1	LDA	GRAN
	ANDA	#1
	LDB	#1
	STB	READSEC
	LDB	#9
	STB	READSEC2
	CMPA	#1
	BEQ	SECT1
	BRA	ISDSKE
SECT1	LDB	#10
	STB	READSEC
	LDB	#18
	STB	READSEC2
	BRA	ISDSKE
TRKADD	ADDA	#1
	STA	READTRK
	BRA	GETDS1
ISDSKE	LDA	NEXTGRAN
	CMPA	#68
	BLS	FULLSETD
	SUBA	#193
	STA	TEMP2
	LDA	READSEC
	ADDA	TEMP2
	STA	READSEC2
FULLSETD	LDB	READSEC
	CLRA
	RTS
ENDFUNCTION
;
